P9941 题解

封面

题目

思路:

因为题中给出要使奇数组的编号之和为偶数偶数组的编号之和为奇数

所以我们只需要知道编号的奇偶性

所以我们可以先统计出奇数和偶数各有多少个。

然后会出现两种情况:奇数多,偶数多。

因为小学学过:奇数加奇数等于偶数,偶数加偶数等于偶数,奇数加偶数等于奇数。

所以可以得出解决方案:

  1. 奇数多时,将两个奇数相加变成偶数,减少奇数的数量,增加偶数的数量。
  2. 偶数多时,将偶数和奇数相加变成奇数,减少偶数的数量,增加奇数的数量。

代码

#include <bits/stdc++.h> // 头文件
using namespace std;
bool jo (int x) { // 判断是奇数还是偶数函数
if ( x % 2 == 0) return 1; // 是偶数返回真
return 0; // 不是就返回假
}
int main() { // 主函数
int n , j = 0 , k = 0; // j 为偶数的数量 k 为奇数的数量
cin >> n; // 输入 n
int a[n];
for(int i = 0; i < n; i++){
cin >> a[i]; // 输入
}
for(int i = 0; i < n ; i++){ // 判断奇数还是偶数
if (jo(a[i])) j++; // 是偶数 j++
else k++; // 不是偶数 k++
}
while(k > j){ // 第一种情况奇数多
k -= 2; // 两个奇数相加等于偶数所以奇数每次减 2
j++; // 偶数加 1
}
if(j > k+1) j=k+1; // 第二种情况偶数多
cout << k+j; // 输出答案
return 0; // 好习惯
}